<?php
require_once(FWK_EXCEPTION."CustonException.class.php");
require_once(BIB_ACTIVE_RECORD);
require_once(FWK_MODEL."AbsModelDao.class.php");
require_once(FWK_MODEL."Upload.class.php");
require_once(FWK_UTIL."FormataDatas.class.php");

/**
 * Classe modelo para usuario
 *
 * @author Vinicius Mendonça <viniciusmr3@gmail.com>
 * @since 1.0 - 25/11/2012
 */
class Usuario extends AbsModelDao{

	public $_table = "usuario";

	public $_id = "id_usuario";
	
	public function getIdUsuario(){
    	return $this->id_usuario;
    }
    
    public function setIdUsuario($idUser){
    	$this->id_usuario = $idUser;
    }

    public function getNomeUsuario(){
    	return utf8_encode($this->nome_usuario);
    }
    public function setNomeUsuario($nomeUser){
    	$this->nome_usuario = $nomeUser;
    }

    public function getUltimoAcesso(){
    	return $this->ultimo_acesso;
    }
    public function setUltimoAcesso($datAcesso){
    	$this->ultimo_acesso = $datAcesso;
    }
    
    public function getDataLogin(){
    	return $this->_dataLogin;
    }
    public function setDataLogin($datLogin){
    	$this->_dataLogin = $datLogin;
    }

    public function getIpUsuario(){
    	return $this->_ipUsr;
    }
    public function setIpUsuario($strIp){
    	$this->_ipUsr = $strIp;
    }

    public function getHostUsuario(){
    	return $this->_strHostRemoto;
    }
    public function setHostUsuario($strHost){
    	$this->_strHostRemoto = $strHost;
    }

    public function getEmailUser(){
    	return $this->email_usuario;
    }
    public function setEmailUser($strEmail){
    	$this->email_usuario = $strEmail;
    }
   
    public function getCpfUsuario(){
    	return $this->cpf_usuario;
    }
    public function setCpfUsuario($strCpf){
    	$this->cpf_usuario = $strCpf;
    }

    public function verUserVisit(){
    	if($this->id_usuario == "000" && $this->nome_usuario = "Visitante")
    		return false;
    	return true;
    }
    
    public function getUsuarioPorCpf($cpf_usuario){
		$strQuery = "SELECT
							id_usuario, nome_usuario
					 FROM 
					 		".$this->_table." WHERE cpf_usuario = ".$cpf_usuario." ORDER BY nome_usuario asc ";
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}	
    
	public function getListaGrid($limitIni=0, $numRegs=15, $count=false, $campoFiltro="", $valorFiltro=""){
		$strQuery = "SELECT ";
		if($count){
			$strQuery.= " count(id_usuario) ";
		}else{
			$strQuery .= "u.id_usuario as 'Codigo', 
			u.nome_usuario as 'Nome', 
			u.cpf_usuario as 'CPF', 
			u.email_usuario as 'Email', 
			if(u.status = 'A', 'Liberado','Bloqueado') as 'Status' ";
		}
		$strQuery .= " FROM
					 		".$this->_table." u 
					 		inner join enderecos e
					 		on u.id_endereco = e.id_endereco 
					 		inner join estados uf
					 		on e.id_estado = uf.id_estado 

					 		WHERE status <> 'E'  ";
		
		if($campoFiltro != "" && $valorFiltro != ""){
			//_utf8 '%diario%' COLLATE utf8_unicode_ci
			switch ($campoFiltro){
				case "Nome":
					$strQuery .= " AND LOWER(u.nome_usuario) LIKE _utf8 '%".strtolower($valorFiltro)."%'  COLLATE utf8_unicode_ci";
					break;
				case "CPF":
					$strQuery .= " AND LOWER(u.cpf_usuario) LIKE _utf8 '%".strtolower($valorFiltro)."%'  COLLATE utf8_unicode_ci";
					break;
				case "Email":
					$strQuery .= " AND LOWER(u.email_usuario) LIKE _utf8 '%".strtolower($valorFiltro)."%'  COLLATE utf8_unicode_ci";
					break;
				case "Cidade":
					$strQuery .= " AND LOWER(e.cidade_endereco) LIKE _utf8 '%".strtolower($valorFiltro)."%'  COLLATE utf8_unicode_ci";
					break;
				case "Estado":
					$strQuery .= " AND LOWER(uf.nome_estado) LIKE _utf8 '%".strtolower($valorFiltro)."%'  COLLATE utf8_unicode_ci";
					break;
	
			}
		}
		
		$strQuery .= " ORDER BY nome_usuario asc ";
		
		if(!$count){
			$strQuery .= " LIMIT
								".$limitIni." ,".$numRegs;
		}
		
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}	
	
	public function getDadosCombo(){
		$strQuery = "SELECT
							id_usuario, nome_usuario
					 FROM 
					 		".$this->_table." ORDER BY nome_usuario asc ";
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}
	
	public function mask($val, $mask) {
		$maskared = '';
		$k = 0;
		for($i = 0; $i<=strlen($mask)-1; $i++)
		{
		 if($mask[$i] == '#')
		 {
		 	if(isset($val[$k]))
		 	$maskared .= $val[$k++];
		 }
		 else
		 {
		 	if(isset($mask[$i]))
		 	$maskared .= $mask[$i];
		 }
		}
		return $maskared;
	}
	
	public function verificaCnpj($cnpj){
		if( strlen( $cnpj ) <> 14 or !is_numeric( $cnpj ) )
		{
			return false;
		}
		$k = 6;
		$soma1 = "";
		$soma2 = "";
		for( $i = 0; $i < 13; $i++ )
		{
			$k = $k == 1 ? 9 : $k;
			$soma2 += ( $cnpj{$i} * $k );
			$k--;
			if($i < 12)
			{
				if($k == 1)
				{
					$k = 9;
					$soma1 += ( $cnpj{$i} * $k );
					$k = 1;
				}
				else
				{
					$soma1 += ( $cnpj{$i} * $k );
				}
			}
		}
	
		$digito1 = $soma1 % 11 < 2 ? 0 : 11 - $soma1 % 11;
		$digito2 = $soma2 % 11 < 2 ? 0 : 11 - $soma2 % 11;
	
		return ( $cnpj{12} == $digito1 and $cnpj{13} == $digito2 );
	}

	
	
	public function verificaCpf($s){
	   //$searchArray = array(".", "/");
	   //$replaceArray = array("", "");
		
	   ///$s = str_replace($searchArray, $replaceArray, $cpf);
	   $c = substr($s, 0, 9);
	   $dv = substr($s, 9, 2);
	   $d1 = 0;
	   $v = false;
	 
	    for ($i = 0; $i < 9; $i++){
	        $d1 = $d1 + substr($c, $i, 1) * (10 - $i);
	    }
	    if($d1 == 0){
	       return false;
	    }
	    $d1 = 11 - ($d1 % 11);
	    if($d1 > 9){
	        $d1 = 0;
	    }
	    if(substr($dv, 0, 1) != $d1){
	       return false;
	    }
	    $d1 = $d1 * 2;
	    for ($i = 0; $i < 9; $i++){
	        $d1 = $d1 + substr($c, $i, 1) * (11 - $i);
	    }
	    $d1 = 11 - ($d1 % 11);
	    if($d1 > 9){
	        $d1 = 0;
	    }
	    if(substr($dv, 1, 1) != $d1){
	        return false;
	    }
	    return true;
	}

	/**
	 * Seta um objeto usu√°rio a partir dos dados vindos do banco de dados
	 *
	 * @author Vinicius Rodrigues <viniciusmr3@gmail.com>
	 * @since 1.0 - 27/11/2012
	 * @param Array arrDados vetor com os dados do usuario vindo do banco de dados
	 */
	public function setObjUsuario($arrDados){
		self::setIdUsuario($arrDados["id_usuario"]);
    	self::setNomeUsuario($arrDados["nome_usuario"]);
    	self::setEmailUser($arrDados["email_usuario"]);
    	self::setIpUsuario($_SERVER["REMOTE_ADDR"]);
    	self::setHostUsuario($_SERVER["REMOTE_HOST"]);
    	self::setCpfUsuario($arrDados["cpf_usuario"]);
    	self::setDataLogin(time());
	}
	
	/**
	 * Metodo para verificar a existencia de um usuario por cpf
	 *
	 * @author Vinicius Rodrigues <viniciusmr3@gmail.com>
	 * @since 1.0 - 27/11/2012
	 * @param String $cpf: cpf do usuario
	 * @param String $email: email do usuario
	 */
	public function validaUsuarioPorCpf($cpf, $id){
		$strQuery = "SELECT * FROM ".$this->_table." where cpf_usuario = '".$cpf."' ";
		
			
		$arrRet = ControlDB::getRow($strQuery,0);
		
		if(!isset($arrRet["id_usuario"]) && count($arrRet)<5 )
			throw new CustonException("Usuario já cadastrado!");
		self::setObjUsuario($arrRet);
		
		//self::registraAcesso($arrRet["id_usuario"]);
		//base64_encode(md5($senha))
		return $arrRet;
	}
	
	/**
	 * Metodo para verificar a existencia de um usuario por email e cpf na recuperacao de senha
	 *
	 * @author Vinicius Rodrigues <viniciusmr3@gmail.com>
	 * @since 1.0 - 27/11/2012
	 * @param String $cpf: cpf do usuario
	 * @param String $email: email do usuario
	 */
	public function validaUsuarioPorCpfEmail($email, $cpf){
		$strQuery = "SELECT * FROM ".$this->_table." where email_usuario = '".$email."' AND ".
					   " cpf_usuario = '".$cpf."' ";
		$arrRet = ControlDB::getRow($strQuery,0);
		
		if(!isset($arrRet["id_usuario"]) && count($arrRet)<5 )
			throw new CustonException("Usuario e/ou CPF Invalidos!");
		self::setObjUsuario($arrRet);
		
		//self::registraAcesso($arrRet["id_usuario"]);
		//base64_encode(md5($senha))
		return $arrRet;
	}
	
	/**
	 * Metodo para verificar a existencia de um usuario por email no banco de dados
	 *
	 * @author Vinicius Rodrigues <viniciusmr3@gmail.com>
	 * @since 1.0 - 27/11/2012
	 * @param String $cpf: cpf do usuario
	 * @param String $senha: senha do usuario
	 */
	public function validaUsuarioDB($email, $senha){

		$strQuery = "SELECT * FROM ".$this->_table." 
						where 
						email_usuario = '".$email."' 
						AND senha_usuario = '".base64_encode(md5($senha))."' 
						AND status = 'A' ";
		$arrRet = ControlDB::getRow($strQuery,0);
		
		if(!isset($arrRet["id_usuario"]) && count($arrRet)<5 )
			throw new CustonException("Usuario e/ou Senha Invalidos!");
		self::setObjUsuario($arrRet);
		
		//self::registraAcesso($arrRet["id_usuario"]);
		//base64_encode(md5($senha))
		return $arrRet;
	}

	public function alterar($id=null,$post,$file){
		try{
			self::salvaPostAutoUtf8($post);
			$this->id_usuario = $id;
			
			self::replace();
			if(self::ErrorMsg()){
				throw new CustonException(self::ErrorMsg());
				print("<pre>");
				print_r($post);
				die("<br/><br /><h1>".self::ErrorMsg()."</h1>");
			}
		}catch(DaoException $e){
			throw new CustonException($e->getMensagem());
		}
	}
	
}
?>